/**
 * 
 * @author yishaqi
 * 2014	2014-12-9		10:34:37
 *
 */
package com.jiuzhe.commercial.ui.components;

import android.content.Context;

/**
 * @author yishaqi
 *
 */
public class DimenManager {
	
	public static final int density_XHDPI = 320;
	
	/**
	 * 根据手机的分辨率从 sp 的单位 转成为 px(像素)
	 * @param context
	 * @param spValue
	 * @return
	 */
	public static float spTpx(Context context, float spValue) {
		
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		
		return (float) (spValue * fontScale);
	}
	
	/**
	 * 1 sp = 1 dp
	 * @param context
	 * @param spValue
	 * @return
	 */
	public static float spTdp(Context context, float spValue) {		
		
		return (float) (pxTdip(context, spTpx(context, spValue)));
	}
	
	/**
	 * 根据手机的分辨率从 px 的单位 转成为 sp(像素)
	 * @param context
	 * @param spValue
	 * @return
	 */
	public static int pxTsp(Context context, float spValue) {
		
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		
		return (int) (spValue / fontScale + 0.5f);
	}
	
	/**
	 * 
	 * 根据手机的分辨率从 dp 的单位 转成为 px(像素),具体末端应用时再+0.5化整形，中间计算时保持float型
	 * @param context
	 * @param dpValue
	 * @return
	 */
	public static float dipTpx(Context context, float dpValue) {

		final float scale = context.getResources().getDisplayMetrics().density;

//		return (int) (dpValue * scale + 0.5f);
		return dpValue * scale + 0.5f;

	}
	
	/**
	 * 
	 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
	 * @param context
	 * @param pxValue
	 * @return
	 */
//	public static int pxTdip(Context context, float pxValue) {
//
//		final float scale = context.getResources().getDisplayMetrics().density;
//
//		return (int) (pxValue / scale + 0.5f);
//
//	}
	public static float pxTdip(Context context, float pxValue) {

		final float scale = context.getResources().getDisplayMetrics().density;

		return (float) (pxValue / scale);

	}
	
	/**
	 * 
	 * 
	 * @param context
	 * @param pxValue
	 * @return
	 */
	public static int pxTdipInCrude(Context context, float pxValue) {

		final float scale = density_XHDPI / 160;

		return (int) (pxValue / scale + 0.5f);

	}
	
	/**
	 * 
	 * @param context
	 * @param pxValue
	 * @param densityDpi
	 * @return
	 */
	public static int pxTdipInCrude(Context context, float pxValue, int densityDpiReferenced) {

		final float scale = densityDpiReferenced / 160;

		return (int) (pxValue / scale + 0.5f);

	}
	
	/**
	 * compute real pxValue
	 * @param context
	 * @param pxValue
	 * @return
	 */
	public static float computeRealPx(Context context, float pxValue) {
		
		int tempHeight = pxTdipInCrude(context, pxValue);		
		return dipTpx(context, tempHeight);
	}
	public static float computeRealPx(Context context, float pxValue, int densityDpiReferenced) {
	
		
		int tempHeight = pxTdipInCrude(context, pxValue, densityDpiReferenced);		
		return dipTpx(context, tempHeight);
	}
	
	/**
	 * 
	 * get real px parameters on user's phone from px parameters given by uiDesigner or transfered px parameters given by httpsServers
	 * @param context
	 * @param pxValue
	 * @return
	 */
	public static int computeRealPxParams(Context context, float pxValue) {
				
		return Math.round(computeRealPx(context, pxValue));
	}
	
	public static float computeRealPxParams(Context context, float pxValue, int densityDpiReferenced) {
		
		return Math.round(computeRealPx(context, pxValue, densityDpiReferenced));
	}
	
}
